package com.me.web.server;

import io.netty.buffer.Unpooled;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
 * TcpServer 类是一个基于 Netty 的 TCP 服务器实现类，继承自 AbstractNettyServer。
 * 启动时配置相应的通道处理器，以处理 TCP 连接和数据传输。
 * 当客户端与服务器建立 TCP 连接时，该类将对连接进行一系列的处理操作。
 * 3、 TcpServer 类是一个基于 Netty 的 TCP 服务器实现类，继承自 AbstractNettyServer。
 *
 * @author chenlei
 */
@Slf4j
@Component
public class TcpServer extends AbstractNettyServer {


    /**
     * TCP 服务器的主机地址。
     */
    private String host = "10.10.10.186";


    /**
     * TCP 服务器的端口。
     */
    private int port = 8081;


    /**
     * 获取 TCP 服务器的主机地址。
     *
     * @return 从配置文件中获取的 TCP 服务器的主机地址
     */
    @Override
    protected String getHost() {
        return host;
    }


    /**
     * 获取 TCP 服务器的端口范围。
     *
     * @return 从配置文件中获取的 TCP 服务器的端口范围
     */
    @Override
    protected int getPort() {
        return port;
    }


    /**
     * 初始化 TCP 服务器的通道处理器。
     * 为每个新建立的 SocketChannel 配置处理器链。
     *
     * @param ch 新建立的 SocketChannel，用于与客户端通信
     */
    @Override
    protected void initChannelHandlers(SocketChannel ch) {
        // 优化：可以使用更灵活的分隔符，如可配置的分隔符，提高代码的可扩展性
        // 添加帧解码器，解决粘包和拆包问题，使用 "\n" 作为分隔符，最大帧长度为 8192 字节
        ch.pipeline().addLast(new DelimiterBasedFrameDecoder(8192, Unpooled.copiedBuffer("\n".getBytes())));
        // 添加字符串解码器，将字节数据解码为字符串
        ch.pipeline().addLast(new StringDecoder());
        // 添加字符串编码器，将字符串编码为字节数据
        ch.pipeline().addLast(new StringEncoder());
        // 添加自定义的处理器，用于处理 TCP 数据
        ch.pipeline().addLast(new TcpServerHandler());
    }
}

